package ivia.fiuza.days.tests;

import ivia.fiuza.days.classes.Ano;
import ivia.fiuza.days.classes.PrimeiroDiaDaSemana;
import ivia.fiuza.days.interfaces.Meses;
import ivia.fiuza.days.interfaces.DiasDaSemana;

import org.junit.Test;
import org.junit.Assert;

public class PrimeiroDiaDaSemanaTeste {

	// Testes auxiliares
	/**
	 * Segunda-feira + 30 dias = Quarta-feira - OK
	 */

	/**
	 * Existem 6 anos bissextos entre o ano 1 e o ano 24 	- OK
	 * Existem 5 anos bissextos entre o ano 1 e o ano 23 	- OK
	 * Há 1 ano bissexto entre o ano 1 e o ano 4 			- OK
	 * Não há anos bissextos entre o ano 1 e o ano 3		- OK
	 * Existem 5 anos bissextos entre o ano 1 e o ano 23	- OK
	 */

	/**
	 * Há 30 incrementos entre janeiro de 1 a janeiro de 24	- OK
	 */

	/**
	 * 1317 não é bissexto 	- OK
	 * 1300 não é bissexto 	- OK
	 * 1200 é bissexto		- OK
	 */

	 /**
	 * Depois de domingo é segunda-feira		- OK
	 * Depois de segunda-feira é terça-feira	- OK
	 * Depois de terça-feira é quarta-feira		- OK
	 * Depois de quarta-feira é quinta-feira	- OK
	 * Depois de quinta-feira é sexta-feira		- OK
	 * Depois de sexta-feira é sábado			- OK
	 * Depois de sábado é domingo				- OK
	 *
	 * Antes de segunda-feira é domingo			- OK
	 * Antes de domingo é sábado				- OK
	 * Antes de sábado é sexta-feira			- OK
	 * Antes de sexta-feira é quinta-feira		- OK
	 * Antes de quinta-feira é quarta-feira		- OK
	 * Antes de quarta-feira é terça-feira		- OK
	 * Antes de terça-feira é segunda-feira		- OK
	 */

	// Lista de Testes
	/**
	 * Dia 1/01/1200 é terça-feira.		- OK
	 * Dia 1/01/6 é domingo.			- OK
	 * Dia 1/01/4 é quinta-feira.		- OK
	 * Dia 1/01/24 é segunda-feira.		- OK
	 * Dia 1/10/2001 é segunda-feira.	- OK
	 * Dia 1/08/15 é sábado.			- OK
	 * Dia 1/08/25 é sexta-feira.		- OK
	 * Dia 1/09/2030 é domingo.			- OK
	 * Dia 1/11/12 é quinta-feira.		- OK
	 * Dia 1/11/4 é segunda-feira.		- OK
	 * Dia 1/10/1807 é quinta-feira.	- OK
	 */

	// Teste genérico
	@Test
	public void testeGenerico() {
		Assert.assertSame( PrimeiroDiaDaSemana.getDiaDaSemana( DiasDaSemana.SABADO ), PrimeiroDiaDaSemana.primeiroDiaDaSemana( Meses.ABRIL, 1200 ) );
	}

//	Segunda-feira + 30 dias = Quarta-feira
	@Test
	public void segundaFeiraMais30DiasQuartaFeira(){
		Assert.assertEquals( DiasDaSemana.QUARTA_FEIRA, PrimeiroDiaDaSemana.avancarDiaDaSemana( DiasDaSemana.SEGUNDA_FEIRA, 30 ) );
	}

//	Existem 6 anos bissextos entre o ano 1 e o ano 24
	@Test
	public void Ha_6_Bissextos_Entre_1_E_24(){
		Assert.assertEquals( 6, PrimeiroDiaDaSemana.contarAnosBissextosAte( 24 ) );
	}

//	Há 1 ano bissexto entre o ano 1 e o ano 4
	@Test
	public void Ha_1_Bissextos_Entre_1_E_4(){
		Assert.assertEquals( 1, PrimeiroDiaDaSemana.contarAnosBissextosAte( 4 ) );
	}

//	Não há anos bissextos entre o ano 1 e o ano 3
	@Test
	public void Ha_0_Bissextos_Entre_1_E_3(){
		Assert.assertEquals( 0, PrimeiroDiaDaSemana.contarAnosBissextosAte( 3 ) );
	}

//	Existem 5 anos bissextos entre o ano 1 e o ano 23
	@Test
	public void Ha_5_Bissextos_Entre_1_E_23(){
		Assert.assertEquals( 5, PrimeiroDiaDaSemana.contarAnosBissextosAte( 23 ) );
	}

//	Há 30 incrementos entre janeiro de 1 a janeiro de 24
	@Test
	public void Ha_30_Incrementos_Entre_Janeiro_1_E_24(){
		Assert.assertEquals( 30, PrimeiroDiaDaSemana.calcularIncrementos( 24 ) );
	}

//	1317 não é bissexto
	@Test
	public void oAno1317NaoEBissexto(){
		Assert.assertFalse( Ano.forBissexto( 1317 ) );
	}

//	1300 não é bissexto
	@Test
	public void oAno1300NaoEBissexto(){
		Assert.assertFalse( Ano.forBissexto( 1300 ) );
	}

//	1200 é bissexto
	@Test
	public void oAno1200EBissexto(){
		Assert.assertTrue( Ano.forBissexto( 1200 ) );
	}

//	Dia 1/01/1200 é terça-feira
	@Test
	public void primeiroDeFevereiroDe_1200_Terca() {
		Assert.assertSame( PrimeiroDiaDaSemana.getDiaDaSemana( DiasDaSemana.TERCA_FEIRA ), PrimeiroDiaDaSemana.primeiroDiaDaSemana( Meses.FEVEREIRO, 1200 ) );
	}

//	Dia 1/01/6 é domingo.
	@Test
	public void primeiroDeJaneiroDe_6_Domingo() {
		// Primeira Linha escrita de teste
		Assert.assertSame( PrimeiroDiaDaSemana.getDiaDaSemana( DiasDaSemana.DOMINGO ), PrimeiroDiaDaSemana.primeiroDiaDaSemana( Meses.JANEIRO, 6 ) );
	}

//	Dia 1/01/4 é quinta-feira
	@Test
	public void primeiroDeJaneiroDe_4_Quinta() {
		// Primeira Linha escrita de teste
		Assert.assertSame( PrimeiroDiaDaSemana.getDiaDaSemana( DiasDaSemana.QUINTA_FEIRA ), PrimeiroDiaDaSemana.primeiroDiaDaSemana( Meses.JANEIRO, 4 ) );
	}

//	Dia 1/01/24 é segunda-feira
	@Test
	public void primeiroDeJaneiroDe_24_Segunda() {
		// Primeira Linha escrita de teste
		Assert.assertSame( PrimeiroDiaDaSemana.getDiaDaSemana( DiasDaSemana.SEGUNDA_FEIRA ), PrimeiroDiaDaSemana.primeiroDiaDaSemana( Meses.JANEIRO, 24 ) );
	}

//	Dia 1/10/2001 é segunda-feira
	@Test
	public void primeiroDeOutubroDe_2001_Segunda() {
		// Primeira Linha escrita de teste
		Assert.assertSame( PrimeiroDiaDaSemana.getDiaDaSemana( DiasDaSemana.SEGUNDA_FEIRA ), PrimeiroDiaDaSemana.primeiroDiaDaSemana( Meses.OUTUBRO, 2001 ) );
	}

//	Dia 1/08/15 é sábado
	@Test
	public void primeiroDeAgostoDe_15_Sabado() {
		// Primeira Linha escrita de teste
		Assert.assertSame( PrimeiroDiaDaSemana.getDiaDaSemana( DiasDaSemana.SABADO ), PrimeiroDiaDaSemana.primeiroDiaDaSemana( Meses.AGOSTO, 15 ) );
	}

//	Dia 1/08/25 é sexta-feira
	@Test
	public void primeiroDeAgostoDe_25_Sexta() {
		// Primeira Linha escrita de teste
		Assert.assertSame( PrimeiroDiaDaSemana.getDiaDaSemana( DiasDaSemana.SEXTA_FEIRA ), PrimeiroDiaDaSemana.primeiroDiaDaSemana( Meses.AGOSTO, 25 ) );
	}

//	Dia 1/09/2030 é domingo
	@Test
	public void primeiroDeSetembroDe_2030_Domingo() {
		// Primeira Linha escrita de teste
		Assert.assertSame( PrimeiroDiaDaSemana.getDiaDaSemana( DiasDaSemana.DOMINGO ), PrimeiroDiaDaSemana.primeiroDiaDaSemana( Meses.SETEMBRO, 2030 ) );
	}

//	Dia 1/11/12 é quinta-feira
	@Test
	public void primeiroDeNovembroDe_12_Quinta() {
		// Primeira Linha escrita de teste
		Assert.assertSame( PrimeiroDiaDaSemana.getDiaDaSemana( DiasDaSemana.QUINTA_FEIRA ), PrimeiroDiaDaSemana.primeiroDiaDaSemana( Meses.NOVEMBRO, 12 ) );
	}

//	Dia 1/11/4 é segunda-feira
	@Test
	public void primeiroDeNovembroDe_4_Segunda() {
		// Primeira Linha escrita de teste
		Assert.assertSame( PrimeiroDiaDaSemana.getDiaDaSemana( DiasDaSemana.SEGUNDA_FEIRA ), PrimeiroDiaDaSemana.primeiroDiaDaSemana( Meses.NOVEMBRO, 4 ) );
	}

//	Dia 1/10/1807 é quinta-feira
	@Test
	public void primeiroDeOutubroDe_1807_Quinta() {
		// Primeira Linha escrita de teste
		Assert.assertSame( PrimeiroDiaDaSemana.getDiaDaSemana( DiasDaSemana.QUINTA_FEIRA ), PrimeiroDiaDaSemana.primeiroDiaDaSemana( Meses.OUTUBRO, 1807 ) );
	}

//	Depois de domingo é segunda-feira
	@Test
	public void depoisDeDomingoVemSegunda(){
		Assert.assertSame( DiasDaSemana.SEGUNDA_FEIRA, PrimeiroDiaDaSemana.avancarDiaDaSemana( DiasDaSemana.DOMINGO, 1 ) );
	}

//	Depois de domingo é segunda-feira
	@Test
	public void depoisDeSegundaVemTerca(){
		Assert.assertSame( DiasDaSemana.TERCA_FEIRA, PrimeiroDiaDaSemana.avancarDiaDaSemana( DiasDaSemana.SEGUNDA_FEIRA, 1 ) );
	}

//	Depois de terça-feira é quarta-feira
	@Test
	public void depoisDeTercaVemQuarta(){
		Assert.assertSame( DiasDaSemana.QUARTA_FEIRA, PrimeiroDiaDaSemana.avancarDiaDaSemana( DiasDaSemana.TERCA_FEIRA, 1 ) );
	}

//	Depois de quarta-feira é quinta-feira
	@Test
	public void depoisDeQuartaVemQuinta(){
		Assert.assertSame( DiasDaSemana.QUINTA_FEIRA, PrimeiroDiaDaSemana.avancarDiaDaSemana( DiasDaSemana.QUARTA_FEIRA, 1 ) );
	}

//	Depois de quinta-feira é sexta-feira
	@Test
	public void depoisDeQuintaVemSexta(){
		Assert.assertSame( DiasDaSemana.SEXTA_FEIRA, PrimeiroDiaDaSemana.avancarDiaDaSemana( DiasDaSemana.QUINTA_FEIRA, 1 ) );
	}

//	Depois de sexta-feira é sábado
	@Test
	public void depoisDeSextaVemSabado(){
		Assert.assertSame( DiasDaSemana.SABADO, PrimeiroDiaDaSemana.avancarDiaDaSemana( DiasDaSemana.SEXTA_FEIRA, 1 ) );
	}

//	Depois de sábado é domingo
	@Test
	public void depoisDeSabadoVemDomingo(){
		Assert.assertSame( DiasDaSemana.DOMINGO, PrimeiroDiaDaSemana.avancarDiaDaSemana( DiasDaSemana.SABADO, 1 ) );
	}

//	Antes de segunda-feira é domingo
	@Test
	public void antesDeSegundaVemDomingo(){
		Assert.assertSame( DiasDaSemana.DOMINGO, PrimeiroDiaDaSemana.recuarDiaDaSemana( DiasDaSemana.SEGUNDA_FEIRA, 1 ) );
	}

//	Antes de domingo é sábado
	@Test
	public void antesDeDomingoVemSabado(){
		Assert.assertSame( DiasDaSemana.SABADO, PrimeiroDiaDaSemana.recuarDiaDaSemana( DiasDaSemana.DOMINGO, 1 ) );
	}

//	Antes de sábado é sexta-feira
	@Test
	public void antesDeSabadoVemSexta(){
		Assert.assertSame( DiasDaSemana.SEXTA_FEIRA, PrimeiroDiaDaSemana.recuarDiaDaSemana( DiasDaSemana.SABADO, 1 ) );
	}

//	Antes de sexta-feira é quinta-feira
	@Test
	public void antesDeSextaVemQuinta(){
		Assert.assertSame( DiasDaSemana.QUINTA_FEIRA, PrimeiroDiaDaSemana.recuarDiaDaSemana( DiasDaSemana.SEXTA_FEIRA, 1 ) );
	}

//	Antes de quinta-feira é quarta-feira
	@Test
	public void antesDeQuintaVemQuarta(){
		Assert.assertSame( DiasDaSemana.QUARTA_FEIRA, PrimeiroDiaDaSemana.recuarDiaDaSemana( DiasDaSemana.QUINTA_FEIRA, 1 ) );
	}

//	Antes de quarta-feira é terça-feira
	@Test
	public void antesDeQuartaVemTerca(){
		Assert.assertSame( DiasDaSemana.TERCA_FEIRA, PrimeiroDiaDaSemana.recuarDiaDaSemana( DiasDaSemana.QUARTA_FEIRA, 1 ) );
	}

//	Antes de terça-feira é segunda-feira
	@Test
	public void antesDeTercaVemSegunda(){
		Assert.assertSame( DiasDaSemana.SEGUNDA_FEIRA, PrimeiroDiaDaSemana.recuarDiaDaSemana( DiasDaSemana.TERCA_FEIRA, 1 ) );
	}
}
